`include "param.v"  

module JUMP_PC (
    input wire [2:0] npc_op,
    input wire [31:0] pc,
    input wire [1:0] ALU_f,
    input wire [31:0] ext,
    input wire [31:0]ALU_C,
    output reg [31:0] jump_pc,
    output reg jump
);
    
//定义npc_op的信号值
parameter  NPC_PC4 =3'b000;
parameter  NPC_BEQ =3'b001;
parameter  NPC_BNE =3'b010;
parameter  NPC_BLT =3'b011;
parameter  NPC_BGE =3'b100;
parameter  NPC_JAL =3'b101;
parameter  NPC_JALR =3'b110;

//定义ALU.f的信号值
parameter GT = 2'b00;
parameter LT = 2'b01;
parameter EQ = 2'b10;
parameter INVALID = 2'b11;



always @(*) begin
    
    if(npc_op==NPC_PC4)begin
        jump_pc = pc+4;
        jump = 0;
    end
    //4种不同的branch
    else if(npc_op==NPC_BGE && (ALU_f==GT || ALU_f== EQ))begin
        jump_pc = pc + ext;
        jump = 1;
    end
    else if(npc_op==NPC_BEQ && ALU_f==EQ)begin
        jump_pc = pc + ext;
        jump = 1;
    end
    else if(npc_op==NPC_BNE && ALU_f != EQ)begin
        jump_pc = pc + ext;
        jump = 1;
    end
    else if(npc_op==NPC_BLT && ALU_f==LT)begin
        jump_pc = pc + ext;
        jump = 1;
    end
    //jalr
    else if(npc_op==NPC_JALR)begin
        jump_pc = ALU_C;
        jump = 1;
    end
    //jal
    else if(npc_op==NPC_JAL)begin
        jump_pc = pc + ext;
        jump = 1;
    end
    else begin jump_pc = pc + 32'h4; 
                jump = 0;        
    end
    
end

endmodule